//
//  ThreadManagerViewController.h
//  ReviewDemo
//
//  Created by 龙 on 2018/5/15.
//  Copyright © 2018年 long. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ThreadManagerViewController : UIViewController

@end

/*
 问题 1、：进程 与 线程？
 
 https://bestswifter.com/deep-gcd/ (深入理解GCD)
 问题 2、: dispatch_async 函数如何实现，分发到主队列和全局队列有什么区别，一定会新建线程执行任务么？
 问题 3、: dispatch_sync 函数如何实现，为什么说 GCD 死锁是队列导致的而不是线程，死锁不是操作系统的概念么？
 问题 4、: 信号量是如何实现的，有哪些使用场景？
 问题 5、: dispatch_group 的等待与通知、dispatch_once 如何实现？
 问题 6、: dispatch_source 用来做定时器如何实现，有什么优点和用途？
 问题 7、: dispatch_suspend 和 dispatch_resume 如何实现，队列的的暂停和计时器的暂停有区别么？
 问题 8、: 线程的生命周期
 问题 9、: 为什么不能在子线程更新 UI ？一定要在主线程更新？
 只有主线程才拥有权限向渲染服务提交打包的图层树信息，完成图形的显示工作。而我们在子线程中提交的UI更新总是无效的，甚至导致崩溃发生。
 */

/* https://www.jianshu.com/p/b03bc9a06ca8
 离屏渲染概念：
 CPU 与 GPU : CPU 即中央处理器，GPU 即图形处理器。
 CPU 所做的工作都在软件层面，而 GPU 在硬件层面。
 CPU 擅长处理具有复杂计算步骤和复杂数据依赖的计算任务，如分布式计算，数据压缩，人工智能，物理模拟，以及其他很多很多计算任务等。
 
 区别：CUP和GPU之所以大不相同，是由于其设计目的的不同，它们分别针对了两种不同的应用场景。
 CPU需要很强的通用性来处理各种不同的类型数据，同时又要逻辑判断又会引入大量的分支跳转和中断处理。这些都使得CPU的内部结构异常复杂。
 而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断纯净的计算环境。
 


 */

/*
 注意：开线程也会占据一定的内存的，所以不要同时开启很多的线程，否则可能导致卡顿问题（http://www.cocoachina.com/ios/20180530/23566.html）

 
 进程 与 线程：
 1、进程：可以理解成一个运行中的应用程序，是系统进行资源分配和调度的基本单位，是操作系统结构的基础，主要管理资源。
 2、线程：是进程的基本执行单元，一个进程对应多个线程。
 
 多线程：在同一时刻，一个 CPU 只能处理1条线程，但 CPU 可以在多条线程之间快速的切换，只要切换的足够快，就造成了多线程一同执行的假象。多线程通过提高资源使用率来提高系统总体的效率，但是也不要开启太多线程，否则可能导致卡顿问题
 
 
 线程 与 队列：一条线程上可以有多个队列。
 
 任务 与 队列
 队列(queue)：队列就是用来管理任务，它采用的是先进先出（FIFO）的原则，一条线程上可以有多个队列。
 任务(block)：任务按照自己通俗一点的理解，就是提到的“事”这个概念，这个“事”就可以理解为任务，那这个“事”也肯定是在线程上面执行的（不管是在当前线程还是你另开启的线程）。这个“事”你可以选择同步或者而是异步执行，这就衍生出了东西也就契合线程上面的同步线程和异步线程。
 
 同步 与 异步
 1、同步(sync)：任务都在当前线程中执行，执行过程中会阻塞当前线程。
 2、异步(async)：任务会开辟新的线程，并在新的线程中执行，不会阻塞当前线程。
 
 串行队列 与 并发队列：
 串行队列：任务按往队列里的添加先后顺序执行，先进先出(FIFO)，前一个任务执行完再开始执行下一个任务（注意一个串行队列里只有一个线程，串行队列中的任务只会放到同一线程中去执行.）
 并发队列：任务会在这个队列中新开线程，并发同时执行（无序）（并发队列中的任务会放到不同的线程中去执行.）
 
 
 1).串行队列同步执行：任务都在当前线程执行（同步），并且顺序执行（串行）
 2).串行队列异步执行：任务都在开辟的新的子线程中执行（异步），并且顺序执行（串行）
 3).并发队列同步执行：任务都在当前线程执行（同步），但是是顺序执行的（并没有体现并发的特性）
 4).并发队列异步执行：任务在开辟的多个子线程中执行（异步），并且是同时执行的（并发）

 
 主线程 与 主队列：
 首先是主线程只会执行主队列的任务，
 主线程执行了子线程的任务，
 主队列只会在主线程上执行
 
 线程安全问题：当多个线程访问同一块资源时，很容易引发数据错乱和数据安全问题。就好比几个人在同一时修改同一个表格，造成数据的错乱。
 

 线程竞态检测工具 Thread Sanitizer
 两个线程同时访问同一个变量，而且其中至少一个线程要做的是写操作，这种情况就叫竞态。
 Xcode 发布了一个新的线程调试工具叫做 Thread Sanitizer 可以检测出这类问题

 
 */
